/////////////////////////////////
// Evaluador de expresiones
////////////////////////////////

tree grammar Evaluador;

options {
	tokenVocab=Anasin;
	ASTLabelType=CommonTree;
}

@header {
	package Principal;
	import java.util.HashMap;
}

@members {
HashMap<String,Float> memory = new HashMap<String,Float>();
}

instrucciones: instruccion+ ;

instruccion : expr {System.out.println ("------------> Resultado " + $expr.result);}
	|   ^(ASIGNACION IDENT expr) 
        {memory.put($IDENT.text, new Float($expr.result));}
    ;


expr returns [float result=0]  
	: ^(SUMA izq=expr der=expr) {$result = izq + der;}
	| ^(RESTA izq=expr der=expr) {$result = izq - der;}
	| ^(MULT izq=expr der=expr) {$result = izq * der;} 
	| ^(DIV izq=expr der=expr) {$result = izq * der;}
	|   IDENT {
		Float v = memory.get($IDENT.text);	
        if ( v!=null ) $result = v;
        else System.err.println("undefined variable "+$IDENT.text);
        }
    | NUMERO {$result = Float.parseFloat ($NUMERO.text);}
    | RESTA NUMERO {$result = -Float.parseFloat ($NUMERO.text);}   
	;	
	catch [ArithmeticException ae] {
		$result = 0;
	}

